본문으로 건너뛰기

03-060. 공백데이터 처리

공백 데이터 처리

텍스트 데이터에는 앞뒤 공백, 중간 공백, 탭 문자 등이 포함되어 있을 수 있다. 이런 공백은 데이터 분석과 비교 작업에 문제를 일으킨다. 공백은 눈에 잘 보이지 않기 때문에 알아채기 쉽지 않은 문제를 일으킨다.

공백 데이터의 문제점

  1. 데이터 중복: "제품A"" 제품A "는 같은 데이터로 보이지만 다르게 인식됨
  2. 그룹화 오류: 카테고리별 집계 시 같은 카테고리가 분리되어 계산됨
  3. 검색 실패: 정확한 값으로 검색해도 공백 때문에 찾지 못함
  4. 정렬 오류: 공백이 있는 데이터가 예상과 다른 위치에 정렬됨

공백 데이터 예시

원본 데이터 (공백 포함)

제품명카테고리가격
" 노트북 ""전자제품 "1200000
"스마트폰"" 전자제품"800000
"키보드 ""액세서리"50000

기본 공백 처리 방법

import pandas as pd

# 샘플 데이터 생성
df = pd.DataFrame([
[' 노트북 ', '전자제품 ', 1200000],
['스마트폰', ' 전자제품', 800000],
['키보드 ', '액세서리', 50000]
], columns=['제품명', '카테고리', '가격'])

print("원본 데이터:")
print(df)
print("\n각 값의 길이:")
for col in ['제품명', '카테고리']:
print(f"{col}: {df[col].str.len().tolist()}")

# 1. 문자열 앞뒤 공백 제거
df_cleaned = df.copy()
df_cleaned['제품명'] = df_cleaned['제품명'].str.strip()
df_cleaned['카테고리'] = df_cleaned['카테고리'].str.strip()

print("\n공백 제거 후:")
print(df_cleaned)
print("\n각 값의 길이:")
for col in ['제품명', '카테고리']:
print(f"{col}: {df_cleaned[col].str.len().tolist()}")

실행 결과:

원본 데이터:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000

각 값의 길이:
제품명: [4, 3, 4]
카테고리: [4, 4, 3]

공백 제거 후:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000

각 값의 길이:
제품명: [3, 3, 3]
카테고리: [3, 3, 3]

전체 데이터프레임 공백 처리

# 모든 문자열 컬럼의 공백을 한 번에 제거
def clean_whitespace(df):
df_clean = df.copy()
string_columns = df_clean.select_dtypes(include=['object']).columns

for col in string_columns:
if df_clean[col].dtype == 'object':
df_clean[col] = df_clean[col].str.strip()

return df_clean

df_cleaned = clean_whitespace(df)
print("전체 공백 제거 결과:")
print(df_cleaned)

실행 결과:

전체 공백 제거 결과:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000

고급 공백 처리

|코드|

# 복잡한 공백 문제가 있는 데이터
df_complex = pd.DataFrame([
[' 노트북\t게이밍 ', '전자제품\n ', 1200000],
['스마트폰 프리미엄', ' 전자제품\r', 800000],
['키보드\t\t무선', '액세서리 ', 50000]
], columns=['제품명', '카테고리', '가격'])

print("복잡한 공백 데이터:")
print(repr(df_complex.iloc[0, 0])) # 첫 번째 제품명의 실제 내용 확인

# 1. 중간 공백 정리 (여러 공백을 하나로)
df_complex['제품명'] = df_complex['제품명'].str.replace(r'\s+', ' ', regex=True)

# 2. 탭 문자와 줄바꿈 문자 제거
df_complex['제품명'] = df_complex['제품명'].str.replace(r'[\t\n\r]', '', regex=True)
df_complex['카테고리'] = df_complex['카테고리'].str.replace(r'[\t\n\r]', '', regex=True)

# 3. 앞뒤 공백 제거
df_complex['제품명'] = df_complex['제품명'].str.strip()
df_complex['카테고리'] = df_complex['카테고리'].str.strip()

print("\n고급 공백 처리 후:")
print(df_complex)

|실행 결과|

복잡한 공백 데이터:
' 노트북\t게이밍 '

고급 공백 처리 후:
제품명 카테고리 가격
0 노트북 게이밍 전자제품 1200000
1 스마트폰 프리미엄 전자제품 800000
2 키보드 무선 액세서리 50000

공백 처리 함수 만들기

|코드|

def comprehensive_clean(df):
"""
데이터프레임의 모든 문자열 컬럼에서 공백을 종합적으로 처리
"""
df_clean = df.copy()
string_columns = df_clean.select_dtypes(include=['object']).columns

for col in string_columns:
if df_clean[col].dtype == 'object':
# 1. 탭, 줄바꿈 문자 제거
df_clean[col] = df_clean[col].str.replace(r'[\t\n\r]', '', regex=True)
# 2. 여러 공백을 하나로 통합
df_clean[col] = df_clean[col].str.replace(r'\s+', ' ', regex=True)
# 3. 앞뒤 공백 제거
df_clean[col] = df_clean[col].str.strip()

return df_clean

# 사용 예시
df_final = comprehensive_clean(df)
print("종합 공백 처리 결과:")
print(df_final)

|실행 결과|

종합 공백 처리 결과:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000

공백 처리 전후 비교

# 공백 처리의 효과 확인
def compare_before_after(df_before, df_after):
print("=== 공백 처리 전후 비교 ===")
print("\n카테고리별 개수 (처리 전):")
print(df_before['카테고리'].value_counts())

print("\n카테고리별 개수 (처리 후):")
print(df_after['카테고리'].value_counts())

print("\n중복 제품명 확인 (처리 전):")
print(f"고유 제품명 개수: {df_before['제품명'].nunique()}")

print("\n중복 제품명 확인 (처리 후):")
print(f"고유 제품명 개수: {df_after['제품명'].nunique()}")

compare_before_after(df, df_final)

실행 결과:

=== 공백 처리 전후 비교 ===

카테고리별 개수 (처리 전):
전자제품 1
전자제품 1
액세서리 1
Name: 카테고리, dtype: int64

카테고리별 개수 (처리 후):
전자제품 2
액세서리 1
Name: 카테고리, dtype: int64

중복 제품명 확인 (처리 전):
고유 제품명 개수: 3

중복 제품명 확인 (처리 후):
고유 제품명 개수: 3

실무 팁

  1. 데이터 로드 시 공백 처리: CSV 파일을 읽을 때 skipinitialspace=True 옵션 사용
  2. 정규 표현식 활용: 복잡한 공백 패턴은 정규 표현식으로 처리
  3. 검증: 공백 처리 후 데이터 개수와 고유값 개수 확인
  4. 자동화: 데이터 전처리 파이프라인에 공백 처리 함수 포함
# CSV 파일 읽을 때 공백 처리
df = pd.read_csv('data.csv', skipinitialspace=True)

# 또는 읽은 후 처리
df = pd.read_csv('data.csv')
df = comprehensive_clean(df)

공백 데이터 처리는 데이터 품질 향상의 기본이며, 정확한 분석 결과를 얻기 위해 반드시 수행해야 하는 전처리 과정이다.